Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 vector-feature-night-mode-enabled skin-theme-clientpref-os vector-sticky-header-enabled" lang="fr" dir="ltr"><head>
<meta charset="UTF-8">
<title>Job Control Language</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://fr.wikipedia.org/wiki/Job_Control_Language"> <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Job_Control_Language rootpage-Job_Control_Language skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><i><span lang="en">Job Control Language</span></i></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="fr" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="fr" dir="ltr"><p class="mw-empty-elt">
</p><p><i><b><span class="lang-en" lang="en">Job Control Language</span></b></i> («&nbsp;langage de contrôle des tâches&nbsp;»), couramment appelé <b>JCL</b>, désigne certains <a href="Langage_de_script" title="Langage de script">langages de scripts</a>, en particulier sur les <a href="Syst%C3%A8me_d'exploitation" title="Système d'exploitation">systèmes d'exploitation</a> <a href="Mainframe" class="mw-redirect" title="Mainframe">mainframe</a> d'<a href="IBM" title="IBM">IBM</a>, dont le rôle est d'exécuter un <a href="Batch_processing" class="mw-redirect" title="Batch processing">batch</a>.
</p><p>Il existe deux langages JCL d'IBM, l'un utilisé sur la famille DOS/360, l'autre sur la famille <a href="OS/360" title="OS/360">OS/360</a>. Bien qu'ils aient en commun des règles de syntaxe et de conception, il s'agit de langages assez différents.
</p>

<div class="mw-heading mw-heading2"><h2 id="Points_communs_aux_JCL_DOS_et_OS">Points communs aux JCL DOS et OS</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Conception">Conception</h3></div>
<p>Dans le JCL, l'unité est le <i><span class="lang-en" lang="en">job</span></i> (la tâche), laquelle consiste en un ou plusieurs <i><span class="lang-en" lang="en">steps</span></i> (étapes). Chaque <span class="lang-en" lang="en">step</span> consiste en l'exécution d'un programme spécifique. Ainsi, un job qui consisterait à créer un rapport pourrait être composé des <span class="lang-en" lang="en">steps</span> suivants&nbsp;:
</p>
<ul><li>sélection des enregistrements voulus à l'aide d'un programme et stockage des résultats dans un <a href="Fichier_temporaire" title="Fichier temporaire">fichier temporaire</a>&nbsp;;</li>
<li>tri des résultats à l'aide d'un utilitaire approprié&nbsp;;</li>
<li>création du rapport proprement dit à l'aide d'un autre programme qui fait le calcul —&nbsp;cumuls,&nbsp;<abbr class="abbr" title="et cetera">etc.</abbr>&nbsp;— et la mise en forme des informations voulues&nbsp;;</li>
<li>affichage du rapport,&nbsp;<abbr class="abbr" title="et cetera">etc.</abbr></li></ul>

<p>Le JCL utilise des identifiants basiques que l'on nomme «&nbsp;cartes&nbsp;» (reste de l’époque où chaque ligne de script, de programme,&nbsp;<abbr class="abbr" title="et cetera">etc.</abbr> était fournie à l’ordinateur au moyen d'une <a href="Carte_perfor%C3%A9e" title="Carte perforée">carte perforée</a>). Un script JCL devra débuter par la carte JOB qui permet notamment&nbsp;:
</p>
<ul><li>de donner un nom au job&nbsp;;</li>
<li>d'identifier le groupe qui recevra le rapport d'exécution&nbsp;;</li>
<li>de définir comment le job doit être exécuté (par exemple sa priorité)</li></ul>
<p>Il est possible de créer des scripts JCL qui pourront être appelés dans d'autres scripts JCL en passant si nécessaire des paramètres. De tels scripts sont appelées procédures.
</p><p>Remarque&nbsp;: Par métonymie, le mot JCL désigne aussi le script (job) lui-même. Ainsi, en environnement IBM, on ne parle pas de script JCL mais simplement de JCL (<abbr class="abbr" title="Exemple">ex.&nbsp;:</abbr> lancer ou exécuter un JCL).
</p>
<div class="mw-heading mw-heading3"><h3 id="Syntaxe">Syntaxe</h3></div>
<p>La syntaxe du JCL comparée à la plupart des langages de batch, est assez lourde. Par exemple, si on désire copier un fichier dans un autre sous <a href="MS-DOS" title="MS-DOS">MS-DOS</a> ou <a href="UNIX" class="mw-redirect" title="UNIX">UNIX</a>, il suffit d'écrire une instruction du style&nbsp;:
</p>
<pre>copy fichier1 fichier2
</pre>
<p>or en JCL OS, pour obtenir le même résultat il faudrait écrire quelque chose comme&nbsp;:
</p>
<pre>//IS198CPY JOB (IS198T30500),'COPY JOB',CLASS=L,MSGCLASS=X
//COPY01 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD DSN=FICHIER1,DISP=SHR
//SYSUT2 DD DSN=FICHIER2,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(CYL,(40,5),RLSE),
// DCB=(LRECL=115,BLKSIZE=1150)
//SYSIN DD DUMMY
</pre>
<p>Cette lourdeur est due à quelques facteurs&nbsp;:
</p>
<ul><li>d'une part le JCL a été développé pour des ordinateurs des années 1960, limités en termes de mémoire et d'instructions par seconde. Que les instructions soient plus faciles à être interprétées pour la machine (et donc plus rapides à exécuter) était un objectif considéré comme plus important qu'avoir des instructions faciles à coder pour le programmeur&nbsp;;</li>
<li>d'autre part, les systèmes /360 ont été conçus dans un esprit <a href="Multi-utilisateur" title="Multi-utilisateur">multi-utilisateur</a>. Il fallait donc transmettre des paramètres permettant par exemple d'identifier qui devait recevoir les rapports d'exécution (ici le compte IS198T30500), quelle était la priorité de la tâche (CLASS), s'il fallait verrouiller ou non les fichiers lus par les programmes durant leur exécution (DISP),&nbsp;<abbr class="abbr" title="et cetera">etc.</abbr></li></ul>
<p>IBM a gardé la syntaxe originelle du JCL de manière que les anciens scripts puissent toujours être exécutés, mais a également introduit des alternatives plus faciles à utiliser pour le programmeur comme CLIST. La possibilité d'utiliser des procédures paramétrables est également une manière de contourner en partie la lourdeur de la syntaxe.
</p><p>Les lignes des scripts JCL sont limités à 80 caractères. Il s'agit d'un héritage du temps où les programmes s'écrivaient à l'aide de cartes perforées de 80 colonnes. Tout ce qui est écrit au-delà du <abbr class="abbr" title="Quatre-vingtième (huitantième / octantième)">80<sup>e</sup></abbr>&nbsp;caractère est ignoré par le système d'exploitation.
En réalité, seuls les 71 premiers caractères sont réellement pris en compte et utilisables par le programmeur. Le <abbr class="abbr" title="Soixante-douzième (septante-deuxième)">72<sup>e</sup></abbr>&nbsp;caractère consiste usuellement en un espace, et les caractères 73 à 80 sont réservés pour la numérotation des lignes.
</p><p>Toutes les lignes, à l'exception des flots d'entrée, doivent commencer par un slash (/), et toutes les lignes contenant les processus du système d'exploitation doivent débuter par deux slashs (//) devant toujours commencer en colonne 1. Il existe deux exceptions à cette règle&nbsp;: le délimiteur (/*), et le commentaire (//*).
</p><p>Beaucoup d'instructions JCL sont trop longues pour tenir sur 71 caractères, mais peuvent être prolongées sur un nombre non-défini de lignes.
</p><p>La syntaxe générale d'une instruction JCL est&nbsp;:
</p>
<pre>//NOM CARTE PARAMETRES
</pre>
<p>Les paramètres sont séparés par des virgules (,) sans espace.
</p>
<div class="mw-heading mw-heading3"><h3 id="Flots_d'entrée"><span id="Flots_d.27entr.C3.A9e"></span>Flots d'entrée</h3></div>
<p>Le JCL permet les flots d'entrée, c'est-à-dire des cartes qui seront utilisés directement par les programmes appelés et non le système d'exploitation directement.
</p><p>Bien que les JCL DOS et OS ne définissent pas les flots d'entrée de la même façon, ils les délimitent tous deux par un slash-étoile (/*) en colonne 1.
</p><p>Les flots, ainsi que les fichiers entrée/sortie, peuvent être décrits à l'aide de la carte DD (qui inspirera plus tard l'utilitaire dd d'UNIX).
</p>
<div class="mw-heading mw-heading2"><h2 id="Points_particuliers_au_JCL_DOS">Points particuliers au JCL DOS</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Paramètres_positionnels"><span id="Param.C3.A8tres_positionnels"></span>Paramètres positionnels</h3></div>
<p>En JCL DOS, les paramètres sont positionnels. L'ordre d'entrée des paramètres est donc extrêmement important, et même l'emplacement destiné aux paramètres optionnels doivent être remplis au moyen de virgules si le programmeur ne les utilise pas.
</p><p>Ceci est illustré par l'exemple ci-dessous&nbsp;:
</p>
<pre>// TLBL TAPEFIL,'COPYTAPE.JOB',,,,2
// ASSGN SYS005,DISK,VOL=VOL01,SHR
// DLBL DISKFIL,'COPYTAPE.JOB',0,SD
// <a href="Extent" title="Extent">EXTENT</a> SYS005,VOL01,1,0,800,16
</pre>
<div class="mw-heading mw-heading3"><h3 id="Dépendance_du_matériel"><span id="D.C3.A9pendance_du_mat.C3.A9riel"></span>Dépendance du matériel</h3></div>
<p>Dans la version originale de DOS/360 ainsi que dans la plupart des versions de DOS/VS, il fallait spécifier le numéro de modèle du matériel utilisé pour lire chaque disque ou cassette, y compris pour les fichiers temporaires. Changer le matériel signifiait donc devoir modifier de nombreux scripts JCL.
</p>
<div class="mw-heading mw-heading2"><h2 id="Points_particuliers_au_JCL_OS">Points particuliers au JCL OS</h2></div>
<p>De manière générale, le JCL des familles OS/360 est plus flexible et plus facile à utiliser que le JCL des familles DOS/360.
</p>
<div class="mw-heading mw-heading3"><h3 id="Cartes_basiques">Cartes basiques</h3></div>
<p>Le JCL OS ne comporte que trois cartes basiques&nbsp;:
</p>
<ul><li>la carte JOB, qui permet d'identifier le job et de fournir des informations qui lui sont relatives&nbsp;;</li>
<li>la carte EXEC, qui permet à chaque step d'identifier quel programme appeler&nbsp;;</li>
<li>la carte DD qui permet d'identifier les fichiers ou flots à utiliser au cours d'un step.</li></ul>
<div class="mw-heading mw-heading3"><h3 id="Paramètres_à_mots-clefs"><span id="Param.C3.A8tres_.C3.A0_mots-clefs"></span>Paramètres à mots-clefs</h3></div>
<p>Le JCL OS utilise également des paramètres à mots-clefs, ce qui signifie que l'ordre de passage des paramètres importe peu et qu'il n'est pas nécessaire d'entrer les paramètres optionnels si ceux-ci ne servent pas.
</p><p>Par exemple&nbsp;:
</p>
<pre>//NEWFILE DD DSN=MYFILE01,UNIT=DISK,SPACE=(TRK,80,10),
// DCB=(LRECL=100,BLKSIZE=1000),
// DISP=(NEW,CATLG,DELETE)
</pre>
<p>De nombreux mots-clefs (DSN, UNIT, SPACE,&nbsp;<abbr class="abbr" title="et cetera">etc.</abbr>) permettent de passer les paramètres relatifs au fichier NEWFILE.
</p>
<div class="mw-heading mw-heading3"><h3 id="Indépendance_vis-à-vis_du_matériel"><span id="Ind.C3.A9pendance_vis-.C3.A0-vis_du_mat.C3.A9riel"></span>Indépendance vis-à-vis du matériel</h3></div>
<p>En JCL OS, le matériel peut être déclaré via des termes génériques du style TAPE ou DISK, ce qui offre une indépendance relative vis-à-vis du matériel.
</p>
<div class="mw-heading mw-heading3"><h3 id="Procédures_paramétrables"><span id="Proc.C3.A9dures_param.C3.A9trables"></span>Procédures paramétrables</h3></div>
<p>Le JCL OS permet de créer des procédures paramétrables, ce qui permet de créer des scripts faciles à réutiliser.
</p><p>Les procédures sont déclarées au moyen de la carte PROC. Les paramètres sont indiqués au moyen d’esperluettes (&amp;) et une valeur par défaut peut être fournie.
</p><p>On peut par exemple créer une procédure de cette manière&nbsp;:
</p>
<pre>//MYPROC PROC FNAME=MYFILE01,SPTYPE=TRK,SPINIT=50,SPEXT=10,LR=100,BLK=1000
.....
//NEWFILE DD DSN=&amp;FNAME,UNIT=DISK,SPACE=(&amp;SPTYPE,&amp;SPINIT,&amp;SPEXT),
// DCB=(LRECL=&amp;LR,BLKSIZE=&amp;BLK),DISP=(NEW,CATLG,DELETE)
....
</pre>
<p>et l'appeler ainsi&nbsp;:
</p>
<pre>//JOB01 JOB ..........
//STEP01 EXEC MYPROC FNAME=JOESFILE,SPTYPE=CYL,SPINIT=10,SPEXT=2,LR=100,BLK=2000
</pre>
<p>ou encore&nbsp;:
</p>
<pre>//JOB02 JOB ..........
//STEP01 EXEC MYPROC FNAME=SUESFILE,SPTYPE=TRK,SPINIT=500,SPEXT=100,LR=100,BLK=5000
</pre>
<div class="mw-heading mw-heading3"><h3 id="Exécution_conditionnelle"><span id="Ex.C3.A9cution_conditionnelle"></span>Exécution conditionnelle</h3></div>
<p>Le JCL OS permet de conditionner l'exécution des steps en fonction des erreurs produites par les steps précédents. En effet, chaque step produit un code retour (COND), qui suit généralement cette norme&nbsp;:
</p>
<ul><li>0&nbsp;: exécution normale</li>
<li>4&nbsp;: erreur mineure</li>
<li>8&nbsp;: erreur importante</li>
<li>12&nbsp;: erreur majeure</li>
<li>16&nbsp;: erreur très sérieuse</li></ul>
<p>Le JCL OS permet de tester (ou modifier) la valeur de ce code erreur pour conditionner l'exécution du step suivant.
</p><p>Ainsi dans le script JCL suivant&nbsp;:
</p>
<pre>//MYJOB JOB ...........
//STEP01 EXEC PGM=PROG01
....
//STEP02 EXEC PGM=PROG02,COND=(4,GT,STEP01)
....
//STEP03 EXEC PGM=PROG03,COND=(8,LE)
....
//STEP04 EXEC PGM=PROG04,COND=(ONLY,STEP01)
....
//STEP05 EXEC PGM=PROG05,COND=(EVEN,STEP03)
....
</pre>
<p>va&nbsp;:
</p>
<ul><li>démarrer le step STEP01 qui exécute le programme PROG01</li>
<li>si le code retour actuel est supérieur à 4, lancer STEP02</li>
<li>si le code retour actuel est inférieur ou égal à 8, lancer STEP03</li>
<li>si STEP01 n'a pas fini normalement, lancer STEP04</li>
<li>lancer STEP05 même si STEP03 a fini anormalement</li></ul>
<p>IBM a également introduit plus tard l'instruction IF qui permet de coder ces conditions un peu plus facilement.
</p>
<div class="mw-heading mw-heading2"><h2 id="Utilitaires">Utilitaires</h2></div>
<p>IBM fournit avec ses installations mainframes divers utilitaires, lesquels peuvent être appelés dans un script JCL. Ils permettent la gestion de fichiers (nommés datasets) telle que copie, allocation, reformatage,&nbsp;<abbr class="abbr" title="et cetera">etc.</abbr> ou des opérations diverses&nbsp;: tri, fusion,&nbsp;<abbr class="abbr" title="et cetera">etc.</abbr>
</p><p>Parmi les plus couramment utilisés on peut citer&nbsp;:
</p>
<ul><li>SORT (tri et fusion de fichiers séquentiels)</li>
<li>IDCAMS (utilitaire de gestion de fichiers VSAM)</li>
<li>IEBGENER (copie ou reformatage de fichiers)</li>
<li>IEBCOPY (copie et fusion de fichiers partitionnés (PDS))</li>
<li>IEBCOMP (<a href="Comparaison_de_fichiers" title="Comparaison de fichiers">comparaison de fichiers</a> séquentiels ou partitionnés)</li>
<li>IEBEDIT (permet de copier des portions de JCL)</li>
<li>IEFBR14 (ce programme n'a aucune action&nbsp;; il est utilisé par exemple lorsqu'on désire allouer ou supprimer des fichiers, opérations décrites dans le JCL et effectuées par le gestionnaire des travaux JES2 et non par le programme lui-même)</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Références"><span id="R.C3.A9f.C3.A9rences"></span>Références</h2></div>
<ul><li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="https://publibz.boulder.ibm.com/epubs/pdf/iea2b570.pdf">z/OS V1R13.0 MVS JCL User's Guide</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> <a rel="nofollow" class="external text" href="https://publibz.boulder.ibm.com/epubs/pdf/iea2b6b1.pdf">z/OS V1R13.0 MVS JCL Reference</a></li>
<li>(en) <a rel="nofollow" class="external text" href="https://web.archive.org/web/20170707133025/http://www.raincode.com/mainframe-rehosting/raincode-jcl-interpreter/">JCL Interpreter</a></li>
<li><abbr class="abbr indicateur-langue" title="Langue : anglais">(en)</abbr> Doug Lowe and Raul Menendez, <i>Murach's OS/390 and z/OS JCL</i>, <small style="line-height:1em;">(<a href="International_Standard_Book_Number" title="International Standard Book Number">ISBN</a>&nbsp;<span class="nowrap">1890774146</span>)</small></li></ul>
<ul id="bandeau-portail" class="bandeau-portail"><li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de l’informatique</span> </span></li> <li><span class="bandeau-portail-element"><span class="bandeau-portail-icone"><span class="noviewer" typeof="mw:File"></span></span> <span class="bandeau-portail-texte">Portail de la programmation informatique</span> </span></li> </ul></div><!--htdig_noindex--><div><div class="zim-footer">
Cet article est issu de <a class="external text" title="Dernière modification le 2023-05-22" href="https://fr.wikipedia.org/wiki/?title=Job_Control_Language&amp;oldid=204512163">Wikipédia</a>. Sauf mention contraire, le texte est disponible sous <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.fr">Creative Commons Attribution-Share Alike 4.0</a>. Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>